package com.wl.cloud.system.service;

import com.wl.cloud.core.dto.DataStoreDTO;
import com.wl.cloud.system.support.dto.SysMenuDTO;
import com.wl.cloud.system.support.dto.SysMenuDistributeDTO;
import com.wl.cloud.system.support.dto.query.SysMenuQueryDTO;
import com.wl.cloud.system.support.vo.RouterVO;
import com.wl.cloud.system.support.vo.SysMenuVO;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort;

import javax.validation.constraints.NotEmpty;
import java.util.List;
import java.util.Set;

/**
 * 菜单表 前端控制器
 *
 * @author wanglin
 * @since 2023-09-18
 */
public interface SysMenuService {

    /**
     * 分页
     *
     * @param pageable
     * @param queryDto
     * @return
     */
    DataStoreDTO<SysMenuVO> page(Pageable pageable, SysMenuQueryDTO queryDto);

    /**
     * 列表
     *
     * @param sort
     * @param queryDto
     * @return
     */
    List<SysMenuVO> list(Sort sort, SysMenuQueryDTO queryDto);

    /**
     * 保存
     *
     * @param dto
     */
    void save(SysMenuDTO dto);

    /**
     * 更新
     *
     * @param dto
     */
    void update(SysMenuDTO dto);

    /**
     * 查看
     *
     * @param id
     * @return
     */
    SysMenuVO get(String id);

    /**
     * 删除
     *
     * @param ids
     */
    void delete(Set<String> ids);

    /**
     * 菜单树形列表
     *
     * @param sort
     * @param queryDto
     * @return
     */
    List<SysMenuVO> treeMenuList(Sort sort, SysMenuQueryDTO queryDto);

    /**
     * 根据角色id获取树形菜单列表
     *
     * @param roleId
     * @return
     */
    List<SysMenuVO> treeMenuListByRoleId(String roleId);

    /**
     * 根据菜单id集合获取菜单列表
     *
     * @param menuIdList
     * @return
     */
    List<SysMenuVO> getListByMenuIds(@NotEmpty List<String> menuIdList);

    /**
     * 根据角色id分配菜单权限
     *
     * @param dto
     */
    void distributeMenu(SysMenuDistributeDTO dto);


    /**
     * 构建前端路由所需要的菜单
     *
     * @param menus 菜单列表
     * @return 路由列表
     */
    List<RouterVO> buildMenus(List<SysMenuVO> menus);

    /**
     * 根据用户ID查询菜单树信息
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
//    List<SysMenuVO> selectMenuTreeByUserId(String userId);

    /**
     * 根据用户userID查询菜单树信息
     *
     * @param userId 用户ID
     * @return 菜单列表
     */
    List<SysMenuVO> selectMenuTreeByUserId(String userId);
}
